package com.shujia

/**
 * 在Java中接口Interface 和 AbstractClass有什么区别？
 * 接口中只能定义抽象的方法
 * 抽象类中中既能定义抽象的方法 也能定义抽象的方法
 * 可以同时实现多个接口，但是只能继承一个抽象类
 *
 * Scala中的trait特征：
 * 结合了Java中的接口以及抽象类两者的优点
 * 可以在特征中定义抽象的方法以及具体的方法
 * 其次在一个类中可以同时实现多个特征
 */
trait MyTrait01 {
  val i1: Int = 10

  // 定义抽象的方法
  def isEqual01(int: Int): Boolean

  // 定义具体的方法
  def isNotEqual01(int: Int): Boolean = {
    !isEqual01(int)
  }

  def printHello01(): Unit = {
    println("Hello MyTrait01")
  }

}

trait MyTrait02 {
  val i2: Int = 20

  // 定义抽象的方法
  def isEqual02(int: Int): Boolean

  // 定义具体的方法
  def isNotEqual02(int: Int): Boolean = {
    !isEqual02(int)
  }

  def printHello02(): Unit = {
    println("Hello MyTrait02")
  }

}

// 在实现多个trait时，如果存在相同的变量或者方法，会导致冲突
class MyClass(id: String, name: String, gender: String, age: Int, clazz: String) extends PersonExtend(name, gender, age) with MyTrait01 with MyTrait02 {
  override def isEqual01(int: Int): Boolean = {
    int == i1
  }

  override def isEqual02(int: Int): Boolean = {
    int == i2
  }
}

object Demo15Trait {
  def main(args: Array[String]): Unit = {
    val c1: MyClass = new MyClass("1500100002", "吕金鹏", "男", 20, "文科一班")

    println(c1.isEqual01(10)) // true
    println(c1.isEqual01(20)) // false
    println(c1.isEqual02(10)) // false
    println(c1.isEqual02(20)) // true

    println(c1.isNotEqual01(10)) // false
    println(c1.isNotEqual01(20)) // true
    println(c1.isNotEqual02(10)) // true
    println(c1.isNotEqual02(20)) // false
  }

}
